/*
 *@Type RandomAccessFileUtil.java
 * @Desc
 * @Author urmsone urmsone@163.com
 * @date 2024/6/13 02:58
 * @version
 */
package utils;

import com.alibaba.fastjson.JSONObject;
import model.command.Command;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.TreeMap;

public class RandomAccessFileUtil {

    private static final String RW_MODE = "rw";
    public static void writeAll(String filePath, TreeMap<String, Command> memTable) {
        for (Command command : memTable.values()) {
            byte[] commandBytes = JSONObject.toJSONBytes(command);
            RandomAccessFileUtil.writeInt(filePath, commandBytes.length);
            int pos =RandomAccessFileUtil.write(filePath, commandBytes);

        }
    }
    private static int getpos(String filePath) {
        RandomAccessFile file = null;//创建一个RandomAccessFile对象，用于读写文件
        long len = -1L;
        try {
            file = new RandomAccessFile(filePath, RW_MODE);
            len = file.length();
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //.返回文件的长度。
        return (int)len;
    }
    public static int write(String filePath, byte[] value) {
        RandomAccessFile file = null;//创建一个RandomAccessFile对象，用于读写文件
        // 计算文件的长度，并将文件指针移动到文件的末尾。
        long len = -1L;
        try {
            file = new RandomAccessFile(filePath, RW_MODE);
            len = file.length();
            file.seek(len);
            //调用RandomAccessFile对象的write()方法将字节数组写入文件
            file.write(value);
            //关闭RandomAccessFile对象。
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //.返回文件的长度。
        return (int)len;
    }
    // 这段代码用于将一个 int 类型的值写入到一个文件中。
    public static void writeInt(String filePath, int value) {
        RandomAccessFile file = null;
        long len = -1L;
        try {
            file = new RandomAccessFile(filePath, RW_MODE);
            len = file.length();
            // 将文件指针移动到文件末尾
            file.seek(len);
            //写入整数值到文件中
            file.writeInt(value);
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static byte[] readByIndex(String filePath, int index, int len) {
        RandomAccessFile file = null;
        //创建一个 byte 数组，用于存储读取的数据
        byte[] res = new byte[len];
        try {
            //尝试打开文件并将文件指针移动到指定的索引位置。如果文件不存在或无法打开，则返回 null。
            file = new RandomAccessFile(filePath, RW_MODE);
            file.seek((long)index);
            //读取数据并将读取的数据存储在 res 数组中
            file.read(res, 0, len);
            // 关闭文件并返回读取的数据。
            return res;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                file.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    //读取只读文件
    public static byte[] readRandomAccessFileByIndex(RandomAccessFile file, int index, int len) {
        //创建一个 byte 数组，用于存储读取的数据
        byte[] res = new byte[len];
        try {
            file.seek((long)index);
            //读取数据并将读取的数据存储在 res 数组中
            file.read(res, 0, len);
            // 关闭文件并返回读取的数据。
            return res;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    //将数据文件内容复制到只读文件中
    public static void copyFileUsingRandomAccessFile(String sourceFilePath, String targetFilePath) {
        try (RandomAccessFile sourceFile = new RandomAccessFile(sourceFilePath, "r");
             FileOutputStream targetFile = new FileOutputStream(targetFilePath)) {

            byte[] buffer = new byte[1024]; // 缓冲区大小为1KB
            int bytesRead;

            // 读取源文件并写入目标文件，直到文件结束
            while ((bytesRead = sourceFile.read(buffer)) != -1) {
                targetFile.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
